package javaAdvanced;

import javaAdvanced.People;

import java.util.Arrays;

/**
 * @author: cuiH
 * Date: 13-11-29
 * 一个枚举类型就是对象
 */
public class EnumTest {
    /**
     * 优势在于：在编译期就发现给定的数值是否合法
     * 另外从代码优化角度，可以用枚举代替全局变量，或者代替一些,魔法数字，常量string等类型
     */
    public static void main(String[] args) {
        People people = People.MY_HONEY;
        System.out.println(people);

        PeopleEnum peopleEnum = PeopleEnum.ME;
        System.out.println(peopleEnum);        //JDK自动实现toSting打印的方法
        System.out.println(peopleEnum.name());            //得到名字
        System.out.println(peopleEnum.ordinal());        //得到排序位置
        System.out.println(peopleEnum.getClass());      //得到类
        //result: ME ME 1 class advancedJava.EnumTest$PeopleEnum

        System.out.println(PeopleEnum.valueOf("ME"));//可以将字符串转化为Enum，valueOf特别通用编程需要的类型
        System.out.println(Arrays.toString(PeopleEnum.values())); //枚举转换为数组的方法
        //result:ME  [MY_HONEY, ME, MY_FRIENDS, HER_FRIENDS]

        TrafficLamp trafficLamp = TrafficLamp.RED;
        System.out.println(trafficLamp);

    }

    //实现基本的枚举类
    public enum PeopleEnum{
        MY_HONEY,ME(1),MY_FRIENDS,HER_FRIENDS ;
        private PeopleEnum(){}   //默认的构造和调用的方法 ，写出来时候IDE默认为黑色，表示已经被调用
        private PeopleEnum(int  test){
            System.out.println("证明枚举类型可以使用该构造方法");}
    }

    //包含抽象方法的枚举类型，类似于类实现的枚举 ,(交通灯),如果枚举只有一个成员时，相当于单例。
    public enum TrafficLamp{
        //特别像json的写法
        RED (40){
            @Override
            public TrafficLamp nextLamp() {
                return GREEN;
            }
        },
        GREEN (60){
            @Override
            public TrafficLamp nextLamp() {
                return YELLOW;
            }
        },
        YELLOW (5){
            @Override
            public TrafficLamp nextLamp() {
                return RED;
            }
        };

        public abstract TrafficLamp nextLamp();
        private int time;
        private TrafficLamp(int time){this.time=time;}
    }
}